package com.evl.wxpay.util.paytype.verify;

import java.util.Map;

import com.evl.common.persistence.dao.WxPayRecordMapper;
import com.evl.common.persistence.model.WxPayRecord;
import com.evl.core.vo.BaseResultVo;
import com.evl.utils.BeanUtils;
import com.evl.wxpay.util.IWXPay;
import com.evl.wxpay.util.paytype.InsertPayRecordException;
import com.evl.wxpay.util.paytype.PayType;
import com.evl.wxpay.util.paytype.WXPayConst;

/**
 * 数据校验类
 * @author dangsheng
 *
 */
public abstract class Verify {
	
	/**
	 * 数据校验方法
	 * @param data
	 * @return
	 * @throws Exception
	 */
	public abstract Map required(Object obj) throws Exception;
	
	/**
	 * 根据自己的输入参数设置支付记录值
	 * @param wxPayRecord
	 * @param data
	 * @return
	 */
	public abstract WxPayRecord logRecord(WxPayRecord wxPayRecord,Object obj);
	
	/**
	 * 根据类型调用微信支付接口
	 * @param wxPayRecord
	 * @param data
	 * @return
	 */
	public abstract Map request(IWXPay wXPay,PayType payType)throws Exception;
	
	/**
	 * 根据返回信息判断是否支付成功
	 * 可以分局不同支付类型不同的返回结果重写该方法自行设定
	 * @param wxPayRecord
	 * @param data
	 * @return
	 */
	public boolean checkStatus(PayType payType){
 		String return_code = strWithNull(payType.getRspData().get("return_code"));
		if(return_code.equals("SUCCESS")){
			payType.setSucessed(true);
		}else{
			payType.setSucessed(false);
		}
		return payType.isSucessed();
	}
	
	/**
	 * 增加支付流水记录，写入日志,通用方法，不同类型的支付可自行覆盖该方法
	 * @param payType
	 * @return
	 * @throws InsertPayRecordException 
	 */
	public int addRecord(PayType payType) throws InsertPayRecordException {
		Map responsData = payType.getRspData();
		WxPayRecord record = new WxPayRecord();
		if(payType.isSucessed()){
			record.setPayStatus(WXPayConst.PAY_STATE_END);
		}else{
			record.setPayStatus(WXPayConst.PAY_STATE_ERROR);
		}
		record.setOpenId(getOpenId(payType));
		record.setPayType(payType.getValue());
		record.setReqTime(payType.getReqTime());
		record.setReqData(payType.getReqXml());
		record.setRspTime(payType.getRspTime());
		record.setRspData(payType.getRspXml());
		record.setUrl(payType.getUrl());
		record.setPayTime(payType.getReqTime());
		record.setError(payType.getError()+"|"+responsData.get("return_msg"));
		try{
			WxPayRecordMapper wxPayRecordMapper = BeanUtils.getBean("wxPayRecordMapper");
			return wxPayRecordMapper.insert(logRecord(record,payType.getObj()));
		}catch (Exception e) {
			throw new InsertPayRecordException("记录支付日志错误:"+e.getMessage());
		}
	};
	
	/**
	 * 获取openid
	 * @param payType
	 * @return
	 */
	public abstract String getOpenId(PayType payType); 
	
	/**
	 * 发送消息,根据需求发送任何消息
	 * @param payType
	 */
	public abstract BaseResultVo sendMessage(PayType payType);
	
	
	/**
	 * 请求结束调用方法,默认为空,根据支付类型自行重写该方法
	 * @param payType
	 */
	public void complete(PayType payType){
	}
	
	public static Integer toInt(Object o){
		if(null == o) {
			return 0;
		}
		if(o instanceof Integer){
			return (Integer)o;
		}
		if(o instanceof String){
			String s = (String)o;
			if(s.trim().equals("")){
				return 0;
			}
			Integer.parseInt(s.trim());
		}
		return 0;
	}
	
	public String strWithNull(Object obj){
		if(null == obj){
			return null;
		} 
		return obj.toString().trim();
	}
	public String getPriceInt100(Double d){
		return Integer.parseInt((d*100)+"")+"";
	}
}
